//package org.young.common.config;
//
//import com.alibaba.druid.pool.DruidDataSource;
//import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
//import com.github.pagehelper.PageInterceptor;
//import org.apache.ibatis.plugin.Interceptor;
//import org.apache.ibatis.session.SqlSessionFactory;
//import org.mybatis.spring.SqlSessionFactoryBean;
//import org.mybatis.spring.SqlSessionTemplate;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
//import org.springframework.boot.context.properties.ConfigurationProperties;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Primary;
//import org.springframework.core.io.Resource;
//import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
//import org.springframework.jdbc.datasource.DataSourceTransactionManager;
//import org.springframework.util.ObjectUtils;
//
//import javax.sql.DataSource;
//import java.io.IOException;
//import java.util.Properties;
//
///**
// * @author lmhd-emp
// * @date 2021/4/26 17:49
// * @description:
// */
//@Configuration
//@ConditionalOnProperty(prefix = "young.ds")
//public class DataSourceConfiguration {
//
//	@Value("${mybatis.model.location}")
//	public  String modelLocation;
//	@Value("${mybatis.xml.location}")
//	private String xmlLocation;
//
//	@Primary
//	@ConfigurationProperties(prefix = "young.ds")
//	@Bean(name = "dataSource")
//	public DataSource dataSourceConfig() {
//		DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
//		return dataSource;
//	}
//
//	@Bean(name = "sqlSessionFactory")
//	public SqlSessionFactory sqlSessionFactory() throws Exception {
////		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
////		sqlSessionFactoryBean.setDataSource(dataSourceConfig());
////		//设置扫描 mybatis-config.xml
////		sqlSessionFactoryBean.setConfigLocation(null);
////		//设置扫描mapper.xml
////		PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
////		Resource[] resources = resolver.getResources(xmlLocation);
////		sqlSessionFactoryBean.setMapperLocations(resources);
////		//设置扫描实体类
////		sqlSessionFactoryBean.setTypeAliasesPackage(modelLocation);
////		return sqlSessionFactoryBean.getObject();
//		try {
//			SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
//			//     sessionFactoryBean.setDataSource(roundRobinDataSouce);
//			sessionFactoryBean.setDataSource(dataSourceConfig());
//			//读取配置
//			sessionFactoryBean.setTypeAliasesPackage(modelLocation);
//			Resource[] resources = new PathMatchingResourcePatternResolver().getResources(xmlLocation);
//			sessionFactoryBean.setMapperLocations(resources);
//			//添加分页插件、打印sql插件
//			Interceptor[] plugins = new Interceptor[] { pageInterceptor(), new SqlPrintInterceptor() };
//			sessionFactoryBean.setPlugins(plugins);
////			if (!ObjectUtils.isEmpty(this.properties.getGlobalConfig())) {
////				sessionFactoryBean.setGlobalConfig(this.properties.getGlobalConfig().convertGlobalConfiguration());
////			}
//			return sessionFactoryBean.getObject();
//		} catch (IOException e) {
////			log.error("mybatis resolver mapper*xml is error", e);
//			return null;
//		} catch (Exception e) {
////			log.error("mybatis sqlSessionFactoryBean create error", e);
//			return null;
//		}
//	}
//
//	@Primary
//	@Bean(name = "sqlSessionTemplate")
//	public SqlSessionTemplate popSqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
//		return new SqlSessionTemplate(sqlSessionFactory);
//	}
//
//	@Primary
//	@Bean(name = "transactionManager")
//	public DataSourceTransactionManager transactionManager() {
//		return new DataSourceTransactionManager(dataSourceConfig());
//	}
//	/**
//	 * 分页插件
//	 *
//	 * @return
//	 */
//	public PageInterceptor pageInterceptor() {
//		PageInterceptor pi = new PageInterceptor();
//		Properties p = new Properties();
//		//分页插件会自动检测当前的数据库链接，自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时，可以使用下面的缩写值：
//		//oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
//		//特别注意：使用 SqlServer2012 数据库时，需要手动指定为 sqlserver2012，否则会使用 SqlServer2005 的方式进行分页
//		p.setProperty("helperDialect", "mysql");
//		//默认值为 false，该参数对使用 RowBounds 作为分页参数时有效。
//		//当该参数设置为 true 时，会将 RowBounds 中的 offset 参数当成 pageNum 使用，可以用页码和页面大小两个参数进行分页。
//		p.setProperty("offsetAsPageNum", "false");
//		//默认值为false，该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时，使用 RowBounds 分页会进行 count 查询。
//		p.setProperty("rowBoundsWithCount", "true");
//		//默认值为 false，当该参数设置为 true 时，如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果（相当于没有执行分页查询，但是返回结果仍然是 Page 类型）。
//		p.setProperty("pageSizeZero", "false");
//		//分页合理化参数，默认值为false。当该参数设置为 true 时，pageNum<=0 时会查询第一页， pageNum>pages（超过总数时），会查询最后一页。默认false 时，直接根据参数进行查询。
//		p.setProperty("reasonable", "true");
//		//为了支持startPage(Object params)方法，增加了该参数来配置参数映射，用于从对象中根据属性名取值， 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable，不配置映射的用默认值
//		//默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
//		p.setProperty("params", "pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero");
//		//支持通过 Mapper 接口参数来传递分页参数，默认值false，分页插件会从查询方法的参数值中，自动根据上面 params 配置的字段中取值，查找到合适的值时就会自动分页。
//		//使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。
//		p.setProperty("supportMethodsArguments", "false");
//		//默认值为 false。设置为 true 时，允许在运行时根据多数据源自动识别对应方言的分页 （不支持自动选择sqlserver2012，只能使用sqlserver）
//		p.setProperty("autoRuntimeDialect", "true");
//		//默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时，会自动获取一个数据库连接， 通过该属性来设置是否关闭获取的这个连接
//		//默认true关闭，设置为 false 后，不会关闭获取的连接，这个参数的设置要根据自己选择的数据源来决定。
//		p.setProperty("closeConn", "true");
//		p.setProperty("returnPageInfo", "check");
//		pi.setProperties(p);
//		return pi;
//	}
//}
